package sanmubird.club.design.observer;

import java.util.HashSet;
import java.util.Set;

/**
 * @author Sam
 */
public class Subject {

	/**
	 * 这里是 list 还是 set ; 由具体的场景决定
	 */
	private Set<Observer> observers = new HashSet<>();

	/**
	 * 添加 订阅者
	 *
	 * @param observer 订阅制
	 */
	public void addObserver(Observer observer) {
		observers.add(observer);
	}

	public boolean removeObserver(Observer observer) {
		return observers.remove(observer);
	}

	/**
	 * 通知所有订阅的观察者
	 * <p>
	 * 观察者模式的三个注意要点
	 * 1.定义了对象间的一对多依赖关系；
	 * 2.当 Subject 对象的状态发生改变时，所有依赖于该 Subject 对象的 Observer 对象都会得到通知；
	 * 3.Observer 对象得到通知后，会自动更新，而不是被动
	 * 其它的所有点都是细枝末节，由具体业务需求来决定。
	 *
	 * @param msg 消息
	 */
	public void notifyAllObserver(String msg) {
		for (Observer observer : observers) {
			observer.receiveMsgThenAction(msg);
		}
	}


}
